import { BaseService } from '../BaseService';
import { User } from '../models/User';
import { QueryBuilder } from '../QueryBuilder';

/**
 * 用户服务类
 */
export class UserService extends BaseService<User> {
  constructor() {
    super(User);
  }

  /**
   * 通过用户名查找用户
   * @param username 用户名
   */
  findByUsername(username: string): User | null {
    return this.findOne({
      where: { username }
    });
  }

  /**
   * 通过邮箱查找用户
   * @param email 邮箱
   */
  findByEmail(email: string): User | null {
    return this.findOne({
      where: { email }
    });
  }

  /**
   * 查询用户列表，支持分页和条件
   * @param page 页码
   * @param pageSize 每页大小
   * @param condition 查询条件
   */
  getUsers(page: number = 1, pageSize: number = 10, condition: Partial<User> = {}): { list: User[], total: number } {
    const offset = (page - 1) * pageSize;
    
    const list = this.find({
      where: condition,
      limit: pageSize,
      offset,
      orderBy: 'createTime DESC'
    });
    
    const total = this.count({ where: condition });
    
    return {
      list,
      total
    };
  }

  /**
   * 使用QueryBuilder进行高级查询
   * @param keyword 搜索关键词
   * @param page 页码
   * @param pageSize 每页大小
   */
  searchUsers(keyword: string, page: number = 1, pageSize: number = 10): { list: User[], total: number } {
    const offset = (page - 1) * pageSize;
    
    const query = new QueryBuilder('user')
      .select('*')
      .where('username', 'LIKE', `%${keyword}%`)
      .andWhere(qb => {
        qb.where('nickname', 'LIKE', `%${keyword}%`)
          .or('email', 'LIKE', `%${keyword}%`);
      })
      .orderBy('createTime', 'DESC')
      .limit(pageSize)
      .offset(offset);
    
    const list = query.all<User>();
    
    // 复用查询条件，只统计总数
    const total = query.count();
    
    return {
      list,
      total
    };
  }

  /**
   * 验证用户登录
   * @param username 用户名
   * @param password 密码
   */
  validateLogin(username: string, password: string): User | null {
    return this.findOne({
      where: { username, password }
    });
  }

  /**
   * 更新用户信息
   * @param user 用户信息
   */
  updateUser(user: Partial<User>): number {
    if (!user.id) {
      throw new Error('更新用户信息需要提供用户ID');
    }
    
    // 自动设置更新时间
    user.updateTime = Math.floor(Date.now() / 1000);
    
    return this.update(user);
  }
} 